/*
    原始值包装类型：Boolean,Number,String为了方便操作原始值，三种特殊的引用类型。
    引用类型和原始值包装类型的区别在于对象的生命周期。在通过new实例化引用类型后，得到的实例会在立刻作用域后被销毁，
    而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。
    5.3.1 Boolean
        new Boolean(true)
        valueOf()被重写了返回true和false
        toString() 返回字符串true和false
    5.3.2 Number
        new Number(10)
        重写了valueOf()、toLocaleString()、toString()
        valueOf()表示的原始数值
        toLocaleString()、toString()返回原始数值字符串
        格式化：
            1.toFixed()返回指定的小数值的字符串，如果小数位数超出指定位数，则就近四舍五入，普遍浏览器支持20位小数
                注意：多个浮点数值的数学计算不一定得到精确结果
            2.toExponential()返回科学计数法
                toPrecision()
            3.isInteger()判断是否是整数
    5.3.3 String
        valueOf()、toLocaleString()和 toString()都返回对象的原始字符串值
        1.JavaScript字符：
            1.每个String()对象都有个length属性
            2.chartAt(2) 返回给定位置的字符
            3.charCodeAt()方法可以查看指定码元的字符编码
            4.fromCharCode()方法用于根据给定的 UTF-16 码元创建字符串中的字符
            5.codePointAt()方法可以从指定码元位置识别完整的码点
        2.normalize()方法
        3.字符串操作方法
            1.concat() 或者 使用加号，将一个字符串和多个字符串拼接成一个新字符串
            2.三个从字符串中提取子字符串的方法 slice()、substr()、subString()
                对于slice()和subString().一般会传2个参数，第一个参数是开始位置，第二个位置是截取的结束位置，如果第二个参数不加参数，则提取到字符串末尾。
                    注意：对于subString()的第二个参数如果比第一个参数的数值小，那么则会将位置颠倒。
                substr()中的第二个参数是截取数量，如果第二个参数不加参数，则提取到字符串末尾。
                对于参数负值的处理
                    slice()会将所有负值都加上字符串长度
                    subString()会将所有负值转成0
                    substr()会将第一个参数值加上字符串长度，第二个负值转成0
        4.字符串位置方法
            1.indexOf()和lastIndexOf() 一个从开头查找一个从末尾查找,第二个参数是开始的位置
        5.字符串包含方法
            startsWith()、endsWith()、includes() 返回true 或者 false
            1、startsWith() 开始于索引0的匹配项，也就是必须是从头开始能配上。如果传了第二个参数，那起始位置按传入的位置开始匹配
            2、endsWith()开始位置是字段长度减去匹配字段长度，也就是从后面开始完全匹配。如果传了参数，那么代表这第二个参数的数字就是匹配的字符串的最后一位。
            3、includes()检查整个字符串，如果传了第二个参数，从第二个参数的数字位置开始匹配
        6.trim() 方法
            字符串删除前后空格的方法。创建了一个字符串副本。
        7.repeat（） 方法  复制字符串
            接收整数参数，表示复制多少次,返回副本结果
        8.padStart（）和 padEnd() 方法 填充符串
            填充字符串，返回的是复制后的字符串
            padStart()从前面开始填充，第一个参数是填充后的位数，第二个参数是填充的字符，如果不写就是空字符串，如果参数小于要填充的字符串长度，则返回原字符串
            padEnd()从后面开始填充，规则一致
        9.字符串迭代与解构
            1.iterator
                使用：字符串[Symbol.iterator].next(); 返回{value:"a",done:false}
            2.for of 循环
            3.[...message]
        10.字符串大小写转换 4个方法
            toLowerCase()/toLocaleLowerCase() 小写
            toUpperCase()/toLocaleUpperCase() 大写
        11.字符串模式匹配方法
            1.match()方法，接收一个参数是正则表达式，或者一个RegExp对象
            2.search()方法，第一个参数是正则表达式字符串，或者一个RegExp对象
            3.replace()方法，第一个参数可以是个字符串或者正则表达式，第二个参数可以是个字符串或者函数，
                如果第一个参数是字符串那么只会替换一次，想要全局替换必须是全局的正则表达式
                如果第二个参数是个函数：只有一个匹配项时，函数返回三个参数，（与整个模式匹配的字符串、匹配项在字符串中的开始位置、整个字符串）
                如果有多个匹配项，第一个参数是每组的捕获项，第二个和第三个参数一致
            4.split()方法，分隔符的参数可以是字符串或者正则字符串
        12.localeCompare()方法  比较字符串
            返回值有三种情况
                如果字符串按字母顺序排在参数字符串的前面，返回-1
                如果字符串按字符顺序排在参数字符串的后面，返回1
                如果字符串和参数字符产相等，返回0
            区分大小写
        13.HTML方法
            具体看书，没人用了
*/
let num = new Number(10.009)
console.log(null === undefined)
console.log(num.toFixed(2)) //数值字符串
console.log(0.1 + 0.2)
console.log(num.toExponential(1))
let code = 'abcde'
console.log(code.charAt(2))
console.log(code.concat('world', '！'))
let stringValue = "hello world";
console.log(stringValue.substring(3))
console.log(stringValue.substring(3,0))
console.log(stringValue.slice(3,0))
console.log(stringValue.substring(0, 0))
let end = "foobarbaz"
console.log(end.endsWith('bar', 6))
console.log(code.repeat(2))